#include <iostream>
#include <string>
//#include <pthread.h>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <thread>
#include "thread.hpp"
#include "lock.hpp"

using namespace std;

int tickets = 1000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void threadRoutine(void *args){
    string name = static_cast<const char *>(args);

    while(1){
        //传入锁
        Lock lock(&mutex);
        if(tickets > 0){
            cout << name << " get a tickets " << tickets-- << endl;
        }else{
            break;
        }
        usleep(5000);
    }
}

int main(){
    Thread t1(1, threadRoutine, (void *)"111111111");
    Thread t2(2, threadRoutine, (void *)"222222222");
    Thread t3(3, threadRoutine, (void *)"333333333");
    Thread t4(4, threadRoutine, (void *)"444444444");

    t1.run();
    t2.run();
    t3.run();
    t4.run();

    t1.join();
    t2.join();
    t3.join();
    t4.join();
    return 0;
}

// //模拟多线程并发抢票
// int tickets = 1000;

// //pthread_mutex_t mutex;

// //在全局进行初始化，以后不用destroy
// //pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


// //需要传给线程的属性
// class TData{
// public:
//     TData(const string &name,pthread_mutex_t *mutex):_name(name),_pmutex(mutex){
        
//     }

//     ~TData(){

//     }
// public:
//     string _name;
//     pthread_mutex_t *_pmutex;
// };


// void threadBuyTickets(void* args){
//     TData *td = static_cast<TData *>(args);


//     while(1){

//         // //加锁
//         // pthread_mutex_lock(td->_pmutex);
        
//         if(tickets>0){
//             usleep(1000);
//             cout << td->_name << "get tickets, remain tickets:" << tickets-- << endl;
//             // pthread_mutex_unlock(td->_pmutex);

//         }else{
//             // pthread_mutex_unlock(td->_pmutex);
//             break;
//         }
//     }

//     usleep(100);

// }



// void run(void* args){
//     string message = static_cast<const char*>(args);
//     while(1){
//         cout << "thread message:" << message << endl;
//         sleep(1);
//     }
// }

// int main(){

//     //定义锁
//     pthread_mutex_t mutex;
//     //初始化锁
//     pthread_mutex_init(&mutex, nullptr);

//     pthread_t tids[4];
//     for (int i = 0; i < 4;i++){
//         char name[64];
//         snprintf(name, 64, "thread-%d", i + 1);
//         TData *td=new TData(name,&mutex);
//         pthread_create(tids + i, nullptr, threadBuyTickets, td);
//     }

//     for (int i = 0;i<4;i++){
//         pthread_join(tids[i], nullptr);
//     }

//     //销毁锁
//     pthread_mutex_destroy(&mutex);

//     // Thread t1(1, run,(void*)"t1t1t1");
//     // cout << "thread name:" << t1.threadname() << " id:" << t1.threadid() << " status:" << t1.status() << endl;
//     // t1.run();
//     // cout << "thread name:" << t1.threadname() << " id:" << t1.threadid() << " status:" << t1.status() << endl;
//     // t1.join();
//     // cout << "thread name:" << t1.threadname() << " id:" << t1.threadid() << " status:" << t1.status() << endl;
    
//     return 0;
// }